package tas.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.LinkedList;
import java.util.List;
import tas.dao.DaoHorarios;
import tas.domain.Horarios;
import tas.sql.ConectaDb;

public class DaoHorariosImpl implements DaoHorarios {

    private final ConectaDb db;

    public DaoHorariosImpl() {
        this.db = new ConectaDb();
    }

    @Override
    public List<Object[]> horariosQry(String filtro) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "HOR.IDHORARIO," // 1
                + "HOR.DESCRIPCIONHORARIO," // 2
                + "HORTIP.DESCRIPCIONTIPOHORARIO," // 3
                + "EST.DESCRIPCIONESTADO," // 4
                + "HOR.IDESTADO " // 5
                + "FROM BDTAS.HORARIO HOR "
                + "LEFT JOIN BDTAS.ESTADO EST "
                + "ON (HOR.IDESTADO=EST.IDESTADO) "
                + "LEFT JOIN BDTAS.HORARIOTIPO HORTIP "
                + "ON (HOR.IDTIPOHORARIO=HORTIP.IDTIPOHORARIO) "
                + " WHERE "
                + filtro;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);

                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[5];

                    f[0] = rs.getObject(1); // HOR.IDHORARIO
                    f[1] = rs.getObject(2); // HOR.DESCRIPCIONHORARIO
                    f[2] = rs.getObject(3); // HORTIP.DESCRIPCIONTIPOHORARIO
                    f[3] = rs.getObject(4); // EST.DESCRIPCIONESTADO
                    f[4] = rs.getObject(5); // HOR.idestado

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String horariosIns(Horarios horarios, String[] idturno, String anio, String unidEje, String corte) {
        String result = null;
        String sql01 = "INSERT INTO BDTAS.HORARIO(DESCRIPCIONHORARIO,IDTIPOHORARIO,IDESTADO, IDAÑO, IDUNIDADEJECUTORA, IDCORTE) VALUES(?,?,?,?,?,?)";
        String sql02 = "INSERT INTO BDTAS.HORARIODETALLE(IDHORARIO, IDAÑO, IDUNIDADEJECUTORA, IDCORTE, IDDIASEMANA, IDTURNO) VALUES(?,?,?,?,?,?)";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                // insert horarios
                PreparedStatement ps = cn.prepareStatement(sql01, new String[]{"IDHORARIO"});
                ps.setString(1, horarios.getDescripcionhorario());
                ps.setInt(2, horarios.getIdtipohorario());
                ps.setInt(3, horarios.getIdestado());
                ps.setString(4, anio);
                ps.setString(5, unidEje);
                ps.setString(6, corte);

                int ctos = ps.executeUpdate();
                Integer idhorario = 0;
                if (ctos > 0) {
                    ResultSet rs = ps.getGeneratedKeys();
                    rs.next();
                    idhorario = rs.getInt(1); // idhorario generado
                }
                ps.close();

                // insert horariodetalles
                ps = cn.prepareStatement(sql02);
                ps.setInt(1, idhorario);
                ps.setString(2, anio);
                ps.setString(3, unidEje);
                ps.setString(4, corte);

                for (int i = 0; i < idturno.length; i++) {
                    ps.setInt(5, (1 + i)); // 1 == lunes
                    ps.setInt(6, Integer.valueOf(idturno[i]));

                    ctos = ps.executeUpdate();
                    if (ctos == 0) {
                        result = "Problemas con un Detalle de Horario";
                        throw new SQLException(result);
                    }
                }

                ps.close();

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> horariosGet(Integer idhorario) {
        List<Object[]> list = null;
        String sql01 = "SELECT "
                + "HOR.DESCRIPCIONHORARIO,"
                + "HORTIP.DESCRIPCIONTIPOHORARIO "
                + "FROM BDTAS.HORARIO HOR LEFT JOIN BDTAS.HORARIOTIPO HORTIP "
                + "ON (HOR.IDTIPOHORARIO = HORTIP.IDTIPOHORARIO) "
                + "WHERE HOR.IDHORARIO=?";

        String sql02 = "SELECT "
                + "dia.DESCRIPCIONDIASEMANA,"
                + "tur.DESCRIPCIONTURNO || '(' || TO_CHAR(tur.HORAINGRESO, 'HH:MM' ) || '-'|| TO_CHAR(tur.HORASALIDA, 'HH:MM' ) ||')'"
                + "FROM BDTAS.HORARIODETALLE hordet left join BDTAS.DIASEMANA dia "
                + "on (dia.iddiasemana=hordet.IDDIASEMANA) "
                + "left join BDTAS.turno tur "
                + "on (tur.idturno = hordet.idturno) "
                + "where hordet.idhorario=? "
                + "ORDER BY hordet.iddetalle";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                // consulta de horario
                PreparedStatement ps = cn.prepareStatement(sql01);
                ps.setInt(1, idhorario);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    list = new LinkedList<Object[]>();

                    Object[] hor = new Object[2];

                    hor[0] = rs.getString(1);
                    hor[1] = rs.getString(2);

                    list.add(hor);
                }
                rs.close();
                ps.close();

                // consulta de horariodetalles
                if (list != null) {
                    ps = cn.prepareStatement(sql02);
                    ps.setInt(1, idhorario);

                    rs = ps.executeQuery();
                    while (rs.next()) {
                        Object[] det = new Object[2];

                        det[0] = rs.getString(1);
                        det[1] = rs.getString(2);

                        list.add(det);
                    }
                }
                ps.close();

                ok = true;

            } catch (SQLException e) {
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public List<Object[]> horariosEst(Integer idhorario) {
        List<Object[]> list = null;
        String sql01 = "SELECT "
                + "DESCRIPCIONHORARIO,"
                + "IDESTADO "
                + "FROM BDTAS.HORARIO "
                + "WHERE IDHORARIO=?";

        String sql02 = "SELECT "
                + "dia.DESCRIPCIONDIASEMANA,"
                + "tur.DESCRIPCIONTURNO || '(' || TO_CHAR(tur.HORAINGRESO, 'HH:MM' ) || '-'|| TO_CHAR(tur.HORASALIDA, 'HH:MM' ) ||')'"
                + "FROM BDTAS.HORARIODETALLE hordet left join BDTAS.DIASEMANA dia "
                + "on (dia.iddiasemana=hordet.IDDIASEMANA) "
                + "left join BDTAS.turno tur "
                + "on (tur.idturno = hordet.idturno) "
                + "where hordet.idhorario=? "
                + "ORDER BY hordet.iddetalle";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                // consulta de horario
                PreparedStatement ps = cn.prepareStatement(sql01);
                ps.setInt(1, idhorario);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    list = new LinkedList<Object[]>();

                    Object[] hor = new Object[2];

                    hor[0] = rs.getString(1);
                    hor[1] = rs.getInt(2);

                    list.add(hor);
                }
                rs.close();
                ps.close();

                // consulta de horariodetalles
                if (list != null) {
                    ps = cn.prepareStatement(sql02);
                    ps.setInt(1, idhorario);

                    rs = ps.executeQuery();
                    while (rs.next()) {
                        Object[] det = new Object[2];

                        det[0] = rs.getString(1);
                        det[1] = rs.getString(2);

                        list.add(det);
                    }
                }
                ps.close();

                ok = true;

            } catch (SQLException e) {
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String horariosEst(Integer idhorario, Integer idestado) {
        String result = null;
        String sql = "UPDATE BDTAS.HORARIO SET IDESTADO=? WHERE IDHORARIO=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, idestado);
                ps.setInt(2, idhorario);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> trabajadoresQry(String filtro) {
        List<Object[]> list = null;

        String sql = "SELECT TRA.IDTRABAJADOR,  "
                + " TRA.IDTRABAJADORCORE, "
                + "  VIS_TRA.IDESTADOSIGA IDESTADO, "
                + " VIS_TRA.APELLIDOPATERNO   ||  ' ' ||  VIS_TRA.APELLIDOMATERNO ||  ', ' || VIS_TRA.NOMBRE TRABAJADOR, "
                + "  VIS_TRA.NUMERODOCUMENTOIDENTIDAD, "
                + " NVL(VIS_DEP.DESCRIPCIONDEPENDENCIA, ' ') DEPENDENCIA, "
                + " NVL(VIS_AREA.DESCRIPCIONAREAS, ' ' ) AREAS, "
                + " CASE WHEN VIS_TRA.IDESTADOSIGA='1' THEN 'ACTIVO' ELSE 'INACTIVO' END ESTADO, "
                + " HOR.DESCRIPCIONHORARIO,"
                + " TRA.IDHORARIOVIGENTE "
                + " FROM BDTAS.TRABAJADOR TRA "
                + "LEFT JOIN ADMINPJ.V_PER_CTL_TRABAJADOR VIS_TRA "
                + "ON (VIS_TRA.IDTRABAJADORCORE=TRA.IDTRABAJADORCORE) "
                + "LEFT JOIN ADMINPJ.V_PER_DEPENDENCIAS VIS_DEP "
                + "ON (VIS_TRA.IDAÑO = VIS_DEP.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_DEP.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_DEP.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_DEP.IDDEPENDENCIACORE) "
                + "LEFT JOIN ADMINPJ.V_PER_AREASPJ VIS_AREA "
                + "ON (VIS_TRA.IDAÑO = VIS_AREA.IDAÑO) "
                + "AND (VIS_TRA.IDUNIDADEJECUTORA = VIS_AREA.IDUNIDADEJECUTORA) "
                + "AND (VIS_TRA.IDCORTE = VIS_AREA.IDCORTE) "
                + "AND (VIS_TRA.IDDEPENDENCIA=VIS_AREA.IDDEPENDENCIACORE) "
                + "AND (VIS_TRA.CODAREAINT=VIS_AREA.CODAREAINT) "
                + "LEFT JOIN BDTAS.HORARIO HOR "
                + "ON (HOR.IDHORARIO=TRA.IDHORARIOVIGENTE) "
                + " WHERE " + filtro;

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[10];

                    f[0] = rs.getObject(1); // TRA.IDTRABAJADOR
                    f[1] = rs.getObject(2); // TRA.IDTRABAJADORCORE
                    f[2] = rs.getObject(3); // IDESTADO
                    f[3] = rs.getObject(4); // TRABAJADOR
                    f[4] = rs.getObject(5); // NUMERODOCUMENTOIDENTIDAD
                    f[5] = rs.getObject(6); // DEPENDENCIA
                    f[6] = rs.getObject(7); // AREA
                    f[7] = rs.getObject(8); // Estado
                    f[8] = rs.getObject(9); // Desc HYorario
                    f[9] = rs.getObject(10); // id Horario

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String trabajadoresGet(Integer idtrabajador) {
        String result = null;
        String sql = "SELECT  "
                + "APELLIDOPATERNO || ' ' || APELLIDOMATERNO || ' ' || NOMBRE "
                + "FROM BDTAS.TRABAJADOR "
                + "WHERE idtrabajador=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, idtrabajador);

                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    result = rs.getString(1);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return result;
    }

    @Override
    public String horarioParaTrabajador(Integer idhorario, Integer idtrabajador) {
        String result = null;
        String sql = "UPDATE BDTAS.TRABAJADOR SET IDHORARIOVIGENTE=? WHERE IDTRABAJADOR=?";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ps.setInt(1, idhorario);
                ps.setInt(2, idtrabajador);

                int ctos = ps.executeUpdate();
                if (ctos == 0) {
                    result = "0 filas afectadas";
                }

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> turnoXdia() {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "IDTURNO,"
                + "DESCRIPCIONTURNO || '(' || TO_CHAR(HORAINGRESO, 'HH:MM' ) || '-'|| TO_CHAR(HORASALIDA, 'HH:MM' ) ||')',"
                + "HORAINGRESO,"
                + "HORASALIDA,"
                + "HORAINICIOREF,"
                + "HORAFINREF "
                + "FROM BDTAS.TURNO "
                + "WHERE IDESTADO=1";

        Connection cn = db.getBdtas();

        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] fil = new Object[6];

                    fil[0] = rs.getInt(1); // IDTURNO
                    fil[1] = rs.getString(2); // TURNO
                    fil[2] = rs.getString(3); // HORAINGRESO
                    fil[3] = rs.getString(4); // HORASALIDA
                    fil[4] = rs.getString(5); // HORAINICIOREF
                    fil[5] = rs.getString(6); // HORAFINREF

                    list.add(fil);
                }
            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public List<Object[]> diasLista(String periodox) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "DESCRIPCIONDIASEMANA,"
                + "' ',"
                + "NULL,"
                + "NULL,"
                + "TO_NUMBER(IDDIASEMANA, 99)*0.1 "
                + "FROM BDTAS.DIASEMANA "
                + "WHERE IDDIASEMANA<(SELECT IDDIASEMANA FROM BDTAS.FECHA WHERE TO_CHAR(IDFECHA, 'YYYYMM')='" + periodox + "' and (rownum=1)) "
                + "UNION "
                + "SELECT "
                + "DIASEM.DESCRIPCIONDIASEMANA,"
                + "TO_CHAR(FEC.IDFECHA, 'DD'),"
                + "FEC.IDFECHA,"
                + "FEC.IDDIASEMANA,"
                + "TO_NUMBER( TO_CHAR(FEC.IDFECHA, 'DD'), 99) "
                + "FROM BDTAS.FECHA FEC "
                + "LEFT JOIN BDTAS.DIASEMANA DIASEM "
                + "ON (DIASEM.IDDIASEMANA = FEC.IDDIASEMANA) "
                + "WHERE TO_CHAR( FEC.IDFECHA, 'YYYYMM')= '" + periodox + "' "
                + "ORDER BY 5";

        Connection cn = db.getBdtas();

        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] fil = new Object[5];

                    fil[0] = rs.getString(1); // DIA
                    fil[1] = rs.getString(2); // NRODIA
                    fil[2] = rs.getString(3); // IDFECHA
                    fil[3] = rs.getString(4); // IDDIASEMANA
                    fil[4] = rs.getString(5); // ORDEN

                    list.add(fil);
                }
            } catch (SQLException e) {
                System.out.println("");
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String programacionIns(Integer idtrabajador,
            List<Timestamp> idfecha, List<Integer> idturno, List<Integer> iddia, String anio, String unidEje, String corte) {
        String result = null;
        String sql01 = "SELECT "
                + "HORAINGRESO,"
                + "HORASALIDA,"
                + "HORAINICIOREF,"
                + "HORAFINREF "
                + "FROM BDTAS.TURNO "
                + "WHERE IDTURNO=?";

        String sql02 = "INSERT INTO BDTAS.FECHAXTRABAJADOR("
                + "IDTRABAJADOR,"
                + "IDFECHA,"
                + "IDTURNO,"
                + "IDDIA,"
                + "HORAINGRESO,"
                + "HORASALIDA,"
                + "HORAINICIOREFRIGERIO,"
                + "HORAFINREFRIGERIO, "
                + "IDAÑO, "
                + "IDUNIDADEJECUTORA, "
                + "IDCORTE "
                + ") VALUES(?,?,?,?,?,?,?,?, ?, ?, ?)";

        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                PreparedStatement ps01 = cn.prepareStatement(sql01);
                PreparedStatement ps02 = cn.prepareStatement(sql02);

                for (int i = 0; i < idturno.size(); i++) {
                    // SELECT
                    ps01.setInt(1, (Integer) idturno.get(i));

                    ResultSet rs = ps01.executeQuery();
                    if (rs.next()) {
                        Timestamp horaingreso = rs.getTimestamp(1);
                        Timestamp horasalida = rs.getTimestamp(2);
                        Timestamp horainicioref = rs.getTimestamp(3);
                        Timestamp horafinref = rs.getTimestamp(4);

                        // INS
                        ps02.setInt(1, idtrabajador);
                        ps02.setTimestamp(2, (Timestamp) idfecha.get(i));
                        ps02.setInt(3, (Integer) idturno.get(i));
                        ps02.setInt(4, (Integer) iddia.get(i));
                        ps02.setTimestamp(5, horaingreso);
                        ps02.setTimestamp(6, horasalida);
                        ps02.setTimestamp(7, horainicioref);
                        ps02.setTimestamp(8, horafinref);
                        ps02.setString(9, anio);
                        ps02.setString(10, unidEje);
                        ps02.setString(11, corte);

                        int ctos = ps02.executeUpdate();
                        if (ctos == 0) {
                            throw new SQLException("Uno de los turnos no se pudo registrar");
                        }
                    } else {
                        throw new SQLException("No se pudo obtener turno (horarios)");
                    }
                    rs.close();
                }

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }

    @Override
    public List<Object[]> programacionCon(Integer idtrabajador, String periodox) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "DIASEM.DESCRIPCIONDIASEMANA,"
                + "TO_CHAR(FECTRA.IDFECHA, 'DD'),"
                + "TUR.DESCRIPCIONTURNO || '(' || TO_CHAR(TUR.HORAINGRESO, 'HH:MM' ) || '-'|| TO_CHAR(TUR.HORASALIDA, 'HH:MM' ) ||')',"
                + "FECTRA.IDTURNO,"
                + "' ' "
                + "FROM BDTAS.FECHAXTRABAJADOR FECTRA "
                + "LEFT JOIN BDTAS.DIASEMANA DIASEM "
                + "ON (DIASEM.IDDIASEMANA=FECTRA.IDDIA) "
                + "LEFT JOIN BDTAS.TURNO TUR "
                + "ON (TUR.IDTURNO=FECTRA.IDTURNO) "
                + "WHERE TO_CHAR( FECTRA.IDFECHA, 'YYYYMM')= '" + periodox + "' "
                + "AND FECTRA.IDTRABAJADOR=" + idtrabajador + " "
                + "ORDER BY 2";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[7];

                    f[0] = rs.getObject(1); // DIA
                    f[1] = rs.getObject(2); // NRODIA
                    f[2] = rs.getObject(3); // TURNO
                    f[3] = rs.getObject(4); // IDTURNO
                    f[4] = rs.getObject(5); // OBSERVACION

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public List<Object[]> programacionConUpd(Integer idtrabajador, String periodox) {
        List<Object[]> list = null;
        String sql = "SELECT "
                + "DIASEM.DESCRIPCIONDIASEMANA,"
                + "TO_CHAR(FECTRA.IDFECHA, 'DD'),"
                + "TUR.DESCRIPCIONTURNO || '(' || TO_CHAR(TUR.HORAINGRESO, 'HH:MM' ) || '-'|| TO_CHAR(TUR.HORASALIDA, 'HH:MM' ) ||')',"
                + "FECTRA.IDDIA,"
                + "FECTRA.IDFECHA "
                + "FROM BDTAS.FECHAXTRABAJADOR FECTRA "
                + "LEFT JOIN BDTAS.DIASEMANA DIASEM "
                + "ON (DIASEM.IDDIASEMANA=FECTRA.IDDIA) "
                + "LEFT JOIN BDTAS.TURNO TUR "
                + "ON (TUR.IDTURNO=FECTRA.IDTURNO) "
                + "WHERE TO_CHAR(FECTRA.IDFECHA, 'YYYYMM')= '" + periodox + "' "
                + "AND FECTRA.IDTRABAJADOR=" + idtrabajador + " "
                + "ORDER BY 2";

        Connection cn = db.getBdtas();
        if (cn != null) {
            try {
                PreparedStatement ps = cn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                list = new LinkedList<Object[]>();
                while (rs.next()) {
                    Object[] f = new Object[7];

                    f[0] = rs.getObject(1); // DIA
                    f[1] = rs.getObject(2); // NRODIA
                    f[2] = rs.getObject(3); // TURNO
                    f[3] = rs.getObject(4); // IDDIA
                    f[4] = rs.getObject(5); // IDFECHA

                    list.add(f);
                }

            } catch (SQLException e) {
            } finally {
                try {
                    cn.close();
                } catch (SQLException e) {
                }
            }
        }

        return list;
    }

    @Override
    public String programacionUpd(Integer idtrabajador, String periodox,
            List<Timestamp> idfecha, List<Integer> idturno, List<Integer> iddia, String anio, String unidEje, String corte) {
        String result = null;
        String sql00 = "DELETE FROM BDTAS.FECHAXTRABAJADOR FECTRA "
                + "WHERE (TO_CHAR(FECTRA.IDFECHA,'YYYYMM')=?) " // CODPERIORO, empl: 201312
                + "AND (FECTRA.IDTRABAJADOR=?)";

        String sql01 = "SELECT "
                + "HORAINGRESO,"
                + "HORASALIDA,"
                + "HORAINICIOREF,"
                + "HORAFINREF "
                + "FROM BDTAS.TURNO "
                + "WHERE IDTURNO=?";

         String sql02 = "INSERT INTO BDTAS.FECHAXTRABAJADOR("
                + "IDTRABAJADOR,"
                + "IDFECHA,"
                + "IDTURNO,"
                + "IDDIA,"
                + "HORAINGRESO,"
                + "HORASALIDA,"
                + "HORAINICIOREFRIGERIO,"
                + "HORAFINREFRIGERIO, "
                + "IDAÑO, "
                + "IDUNIDADEJECUTORA, "
                + "IDCORTE "
                + ") VALUES(?,?,?,?,?,?,?,?, ?, ?, ?)";


        Connection cn = db.getBdtas();
        if (cn != null) {
            boolean ok = false;
            try {
                cn.setAutoCommit(false);

                PreparedStatement ps00 = cn.prepareStatement(sql00);
                PreparedStatement ps01 = cn.prepareStatement(sql01);
                PreparedStatement ps02 = cn.prepareStatement(sql02);

                // delete
                ps00.setString(1, periodox);
                ps00.setInt(2, idtrabajador);
                int ctos = ps00.executeUpdate();
                if (ctos == 0) {
                    throw new SQLException("No se pudo cambiar turnos programados");
                }
                ps00.close();

                for (int i = 0; i < idturno.size(); i++) {
                    // SELECT
                    ps01.setInt(1, (Integer) idturno.get(i));

                    ResultSet rs = ps01.executeQuery();
                    if (rs.next()) {
                        Timestamp horaingreso = rs.getTimestamp(1);
                        Timestamp horasalida = rs.getTimestamp(2);
                        Timestamp horainicioref = rs.getTimestamp(3);
                        Timestamp horafinref = rs.getTimestamp(4);

                        // INS
                         ps02.setInt(1, idtrabajador);
                        ps02.setTimestamp(2, (Timestamp) idfecha.get(i));
                        ps02.setInt(3, (Integer) idturno.get(i));
                        ps02.setInt(4, (Integer) iddia.get(i));
                        ps02.setTimestamp(5, horaingreso);
                        ps02.setTimestamp(6, horasalida);
                        ps02.setTimestamp(7, horainicioref);
                        ps02.setTimestamp(8, horafinref);
                        ps02.setString(9, anio);
                        ps02.setString(10, unidEje);
                        ps02.setString(11, corte);

                        ctos = ps02.executeUpdate();
                        if (ctos == 0) {
                            throw new SQLException("Uno de los turnos no se pudo registrar");
                        }
                    } else {
                        throw new SQLException("No se pudo obtener turno (horarios)");
                    }
                    rs.close();
                }

                ok = true;

            } catch (SQLException e) {
                result = e.getMessage();
            } finally {
                try {
                    if (ok) {
                        cn.commit();
                    } else {
                        cn.rollback();
                    }

                    cn.setAutoCommit(true);
                    cn.close();

                } catch (SQLException e) {
                    result = e.getMessage();
                }
            }
        }

        return result;
    }
}
